package com.sky.aspect;

import com.sky.anno.AutoFill;
import com.sky.constant.AutoFillConstant;
import com.sky.context.BaseContext;
import com.sky.enums.AutoFillType;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.time.LocalDateTime;

/**
 * 公共字段填充
 * */
@Aspect
@Component
@Slf4j
public class AutoFillAspect {

    @Before("@annotation(autoFill)")
    public void before(JoinPoint jp, AutoFill autoFill) throws Exception {
        log.info(jp.toString());
        // 获取业务方法的参数
        Object[] args = jp.getArgs();
        // 取第0个参数，因为insert或者是update就一个参数
        Object arg = args[0];
        // 根据填充类型，填充不同的字段
        AutoFillType type = autoFill.type();
        if(type == AutoFillType.INSERT){
            // insert， create_user  create_time update_user update_time
            // create_user
            Method setCreateUser = arg.getClass().getMethod(AutoFillConstant.SET_CREATE_USER, Long.class);
            setCreateUser.invoke(arg, BaseContext.getCurrentId());
            // create_time
            Method setCreateTime = arg.getClass().getMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
            setCreateTime.invoke(arg, LocalDateTime.now());
            // update_user
            Method updateUser = arg.getClass().getMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);
            updateUser.invoke(arg, BaseContext.getCurrentId());
            // update_time
            Method setUpdateTime = arg.getClass().getMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
            setUpdateTime.invoke(arg, LocalDateTime.now());
        }else{
            // update， update_user update_time
            // update_user
            Method updateUser = arg.getClass().getMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);
            updateUser.invoke(arg, BaseContext.getCurrentId());
            // update_time
            Method setUpdateTime = arg.getClass().getMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
            setUpdateTime.invoke(arg, LocalDateTime.now());
        }
    }

}
